首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >then不是函数错误- Node promise库

then不是函数错误- Node promise库
EN

Stack Overflow用户
提问于 2016-03-30 00:20:11
回答 1查看 12.2K关注 0票数 2

我是Node的新手,这是我第一次尝试使用promise库。也就是说,下面是我要遵循的简单示例:http://zpalexander.com/blog/javascript-promises-node-js/

这是在没有错误的情况下执行的代码,但是正如预期的那样,它在完成文件读取和循环数组之前记录了“完成”。

代码语言:javascript
复制
    var Promise = require('bluebird');
var Converter = Promise.promisifyAll(require("csvtojson")).Converter;
var converter = new Converter({});
var Client = Promise.promisifyAll(require('node-rest-client')).Client;
var client = new Client();
var responseArray = [];

converter.fromFile("./ToterFeed.csv", function(err,result){
    for (var i = 0, len = result.length; i < len; i++) {
        var args = {
            data: JSON.stringify(result[i]),
            headers: { "Content-Type": "application/json" }
        };
        client.post("http://192.168.1.102:8080/api/ToterFeed/v1", args, function (data, response) {
            responseArray.push(data.responses);
            console.log(data.responses[0]);

        });


    }

})

console.log("done");

这是根据我的解释更新的代码。我收到"then is not a function“错误。

代码语言:javascript
复制
  var Promise = require('bluebird');
var Converter = Promise.promisifyAll(require("csvtojson")).Converter;
var converter = new Converter({});
var Client = Promise.promisifyAll(require('node-rest-client')).Client;
var client = new Client();
var responseArray = [];

converter.fromFile("./ToterFeed.csv").then(function(err,result){
    for (var i = 0, len = result.length; i < len; i++) {
        var args = {
            data: JSON.stringify(result[i]),
            headers: { "Content-Type": "application/json" }
        };
        client.post("http://192.168.1.102:8080/api/ToterFeed/v1", args, function (data, response) {
            responseArray.push(data.responses);
            console.log(data.responses[0]);
        });
    }

}).then(console.log("done"));

我的目标是运行fill read和数组迭代直到完成,然后打印"done“。任何见解都是非常感谢的!谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 00:29:32

现在已经差不多了,需要做一些小的更改-- HTTP post也将是异步的,所以当您使用promisifyAll包装它时,您可以从您的第一个回调中返回它(这意味着后续对.then的调用将等待它的完成)。还要注意promisifyAll creates extra functions with a suffix of Async,所以您需要调用这些版本才能拿回承诺。

在迭代数组并创建多个帖子时,需要使用Promise.all等待正在创建的所有promises的完成。

最后,最终的console.log需要包装在一个函数中(.then()总是将一个函数作为参数)。像这样的东西应该是有效的:

代码语言:javascript
复制
var Promise = require('bluebird');
var Converter = Promise.promisifyAll(require("csvtojson")).Converter;
var converter = new Converter({});
var Client = Promise.promisifyAll(require('node-rest-client').Client);
var responseArray = [];

converter.fromFileAsync("./ToterFeed.csv").then(function(result){
    var promises = [];
    for (var i = 0, len = result.length; i < len; i++) {
        var args = {
            data: JSON.stringify(result[i]),
            headers: { "Content-Type": "application/json" }
        };
        // Add a promise to the array of promises - this
        // will call the post then process the result.
        promises.push(
           Client.postAsync(
               "http://192.168.1.102:8080/api/ToterFeed/v1", 
               args
           ).then(function (data) {
               responseArray.push(data.responses);
           }));
    }
    // Return Promise.all on all of our posts and 
    // their response handlers
    return Promise.all(promises);
}).then(function () {
    console.log("done");
});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36289779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档