Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 然后不是一个函数错误-节点承诺库_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

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

Javascript 然后不是一个函数错误-节点承诺库,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我是Node的新手,这是我第一次尝试使用promise库。话虽如此,下面是一个简单的例子: 这是执行时不会出错的代码,但是在完成文件读取和循环数组之前,它会记录“完成” var Promise = require('bluebird'); var Converter = Promise.promisifyAll(require("csvtojson")).Converter; var converter = new Converter({}); var Client = Promise.

我是Node的新手,这是我第一次尝试使用promise库。话虽如此,下面是一个简单的例子:

这是执行时不会出错的代码,但是在完成文件读取和循环数组之前,它会记录“完成”

    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");
var Promise=require('bluebird');
var转换器=promisifyAll(要求(“csvtojson”)。转换器;
var转换器=新转换器({});
var Client=promisefyall(require('node-rest-Client')).Client;
var client=new client();
var responseArray=[];
converter.fromFile(“./ToterFeed.csv”),函数(err,result){
for(变量i=0,len=result.length;i
这是根据我的解释更新的代码。我收到“then is not a function”错误

var Promise=require('bluebird');
var转换器=promisifyAll(要求(“csvtojson”)。转换器;
var转换器=新转换器({});
var Client=promisefyall(require('node-rest-Client')).Client;
var client=new client();
var responseArray=[];
converter.fromFile(“./ToterFeed.csv”)。然后(函数(err,result){
for(变量i=0,len=result.length;i

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

您就快到了,需要做一些小的更改-HTTP post也将是异步的,因此当您使用promisifyAll包装它时,您可以从第一次回调返回它(这将意味着后续调用。然后将等待它完成)。还要注意的是,您需要调用这些版本以收回承诺

当您迭代一个数组并创建多个帖子时,您需要使用来等待您创建的所有承诺完成

最后,您的最终
控制台.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");
});
var Promise=require('bluebird');
var转换器=promisifyAll(要求(“csvtojson”)。转换器;
var转换器=新转换器({});
var Client=promisefyall(require('node-rest-Client').Client);
var responseArray=[];
converter.fromFileAsync(“./ToterFeed.csv”)。然后(函数(结果){
var承诺=[];
for(变量i=0,len=result.length;i
Bluebird不会更改promisified API的方法,它通过带有
…Async
后缀的方法对它们进行扩展,这些后缀是承诺返回的后缀。您需要将回调传递给
,然后
,而不是调用
console.log(…)
的结果,谢谢您的示例,看到这个例子后,其他的评论对我来说更有意义。我现在得到了一个不同的错误,我不确定我是否做错了什么,或者是蓝鸟的错误。在这一行:converter.fromFileAsync(“./ToterFeed.csv”).then(function(err,result){数组现在被返回到err变量而不是result变量。你知道为什么吗?
循环的
在哪里结束?在我看来像是语法错误。就在这一行之前:})。then(function(data){我不得不添加另一个花括号。不,@Bergi是对的-你需要收集承诺,然后做一个.all-then a.然后在所有承诺都解决后运行最终的console.log,否则它只会做第一篇文章。我会更新…谢谢。但是你应该返回数据。响应;
,然后是
Promise.all
将通过
responseArray
自行解决-无需手动将结果推送到那里。
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");
});