Javascript 然后不是一个函数错误-节点承诺库
我是Node的新手,这是我第一次尝试使用promise库。话虽如此,下面是一个简单的例子: 这是执行时不会出错的代码,但是在完成文件读取和循环数组之前,它会记录“完成”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.
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");
});