我对Node.js承诺的理解仍然非常粗糙,我想我在这里缺少一些关键点,但我只想让函数返回一个promise,这样我就可以将它们链接在一起并拥有类似的东西:
importer = new require(importers[i].module);
importer.init(importers[i].options)
.then(importer.run) // also it is possible to give some parameters here?
.then(function (res) {
events = res;
});
导入器是一个简单的模块,有两种方法:
'use strict';
var q = require('q');
var FB = require('fb');
var promises = [];
var FacebookImport = {
init: function (options) {
var deferred = q.defer();
FB.api('oauth/access_token', {
client_id: options.clientID,
client_secret: options.clientSecret,
grant_type: 'client_credentials'
}, function (res) {
if (!res || res.error) {
console.log(!res ? 'error occurred' : res.error);
return;
}
var accessToken = res.access_token;
FB.setAccessToken(res.access_token);
deferred.resolve(accessToken);
});
return deferred.promise;
},
run: function () {
var deferred = q.defer();
FB.api('4', function (res) {
if (!res || res.error) {
console.log(!res ? 'error occurred' : res.error);
return;
}
console.log(res);
deferred.resolve(res);
});
return deferred.promise;
}
};
exports = module.exports = FacebookImport;
重点是首先从Facebook获取身份验证令牌,然后查询图表api以获取某些内容。所以这两个函数应该只能一个接一个地运行。
谢谢, 迈克尔
答案 0 :(得分:2)
请记住,从then
您可以返回一个承诺,并且只有在承诺结算后才会调用链中的下一个then
。您可以按如下方式重写代码:
importer
.init(importers[i].options)
.then(function(accessToken) {
return importer.run(accessToken);
})
.then(function(res) {
events = res;
});
或使用ES6:
importer
.init(importers[i].options)
.then(accessToken => importer.run(accessToken))
.then(res => { events = res; });
同样值得阅读ES6 Promises,因为它将成为未来的标准。不要使用q.defer()
,而是执行以下操作:
return new Promise((resolve, reject) => {
...
reject(err);
...
resolve(accessToken);
...
});
答案 1 :(得分:-1)
说明Node.js中的链接。
var readStream = fs.createReadStream('file1.txt');
var writeStream = fs.createWriteStream('file2.txt');
readStream.pipe(writeStream);