Node.js理解,两种方法链接

时间:2015-12-17 09:55:49

标签: javascript node.js asynchronous promise

我对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以获取某些内容。所以这两个函数应该只能一个接一个地运行。

谢谢, 迈克尔

2 个答案:

答案 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);