then is not a function error - 节点承诺库
then is not a function error - Node promise library
我是 Node 新手,这是我第一次尝试使用 promise 库。话虽如此,这是我正在关注的简单示例:http://zpalexander.com/blog/javascript-promises-node-js/
这是执行时没有错误的代码,但正如预期的那样,它会在完成文件读取和遍历数组之前记录 "done"。
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" 错误。
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"));
我的目标是 运行 填充读取和数组迭代完成然后打印 "done"。非常感谢任何见解!谢谢
您就快完成了,需要进行一些小的更改 - HTTP post 也将是异步的,因此当您使用 promisifyAll 包装它时,您可以 return 从您的第一个开始回调(这将意味着对 .then 的后续调用将等待其完成)。另请注意 promisifyAll creates extra functions with a suffix of Async,因此您需要调用这些版本以取回承诺。
当您遍历一个数组并创建多个 post 时,您需要使用 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");
});
我是 Node 新手,这是我第一次尝试使用 promise 库。话虽如此,这是我正在关注的简单示例:http://zpalexander.com/blog/javascript-promises-node-js/
这是执行时没有错误的代码,但正如预期的那样,它会在完成文件读取和遍历数组之前记录 "done"。
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" 错误。
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"));
我的目标是 运行 填充读取和数组迭代完成然后打印 "done"。非常感谢任何见解!谢谢
您就快完成了,需要进行一些小的更改 - HTTP post 也将是异步的,因此当您使用 promisifyAll 包装它时,您可以 return 从您的第一个开始回调(这将意味着对 .then 的后续调用将等待其完成)。另请注意 promisifyAll creates extra functions with a suffix of Async,因此您需要调用这些版本以取回承诺。
当您遍历一个数组并创建多个 post 时,您需要使用 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");
});