然后不是函数错误 - 节点承诺库

时间:2016-03-29 16:20:11

标签: javascript node.js promise bluebird

我是Node的新手,这是我第一次尝试使用promise库。话虽如此,这是我跟随的简单示例:http://zpalexander.com/blog/javascript-promises-node-js/

这是执行时没有错误的代码,但是正如预期的那样记录"完成"在完成文件读取和循环遍历数组之前。

    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");

这是基于我的解释的更新代码。我收到&#34;然后不是函数&#34;错误。

  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"));

我的目标是将填充读取和数组迭代运行完成,然后打印&#34;完成&#34;。任何见解都非常感谢!感谢。

1 个答案:

答案 0 :(得分:2)

您几乎就在那里,需要进行一些小的更改 - HTTP帖子也是异步的,所以当您使用promisifyAll包装它时,您可以从第一次回调中返回(这意味着后续拨打.then将等待其完成)。另请注意promisifyAll creates extra functions with a suffix of Async,因此您需要调用这些版本以获得承诺。

当你在一个数组上迭代并创建多个帖子时,你需要使用Promise.all来等待你所创建的所有承诺的完成。

最后,您的最终console.log需要包含在函数中(.then()始终将函数作为参数)。这样的事情应该有效:

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");
});