承诺以for循环早期返回

时间:2014-03-04 08:37:44

标签: javascript node.js promise

我是Promises的新手,所以我可能会在这里做些蠢事,但我似乎无法弄明白。

就是这样,我知道我正走在正确的道路上,提前了解一些信息。我有一个authenticate方法,它返回一个promise:

APIWrapper.prototype.authenticate = function() {
  var self = this;
  return new Promise(function(resolve, reject) {
    request({
      uri: self.httpUri + '/auth/authenticate',
      method: 'GET',
      headers: {
        auth_user: self.user,
        auth_pass: self.pass,
        auth_appkey: self.appkey
      }
    }, function(err, res, body) {
      if (err) return reject(err);
      self.parser.parseXML(body, function(err, result) {
        if (err) return reject(err);
        if (result.error) { return reject(result.error) }
        self.token = result.auth.token[0];
        return resolve(result);
      });
    });
  });
};

我用.getDashboards()链接这个:

wrapper.authenticate().then(function() {
  wrapper.getDashboards();
}).then(function(result) {
  console.log('result', result);
});

.getDashboards()也会返回一个承诺:

APIWrapper.prototype.getDashboards = function() {
  var self = this;
  return new Promise(function(resolve, reject) {
    request({
      url: self.httpUri + '/user/dashboard',
      method: 'GET',
      headers: {
        auth_appkey: self.appkey,
        auth_token: self.token
      }
    }, function(err, res, body) {
      if (err) { return reject('Could not connect to the API endpoint'); };
      self.parser.parseXML(body, function(err, data) {
        var dashboards = [];
        if(err) { return reject(err); }
        if(data.error) { return reject(data.error); }
        for(var i = 0; i < data.Dashboards.Dashboard.length; i++) {
          dashboards.push(self.getDashboard(data.Dashboards.Dashboard[i]));
        }
        // returns early here
        resolve(dashboards);
      });
    });
  });
};

目前使用.getDashboard()这样的方法:

APIWrapper.prototype.getDashboard = function(db) {
  var dashboard = {};
  dashboard.title = db.Title[0];
  dashboard.id = db.$.id;
  console.log(dashboard);
  return dashboard;
};

此代码的作用是在返回仪表板之前返回result。我怀疑resolve()中的.getDashboards()是否等待for循环完成?我是否还需要在.getDashboard()方法中使用promises,或者在解决.getDashboards()承诺之前如何等待它完成?

输出:

> result undefined
{ title: 'Dashboard 1', id: '3271' }
{ title: 'Dashboard 2', id: '3272' }
{ title: 'Dashboard 3', id: '3273' }

我现在正在使用此Promise实现:https://github.com/then/promise

1 个答案:

答案 0 :(得分:2)

你需要回复将它链接起来的承诺:

wrapper.authenticate().then(function() {
  return wrapper.getDashboards();
}).then(function(result) {
  console.log('result', result);
});

在您的情况下,它可以简化为

wrapper.authenticate()
.then(wrapper.getDashboards)
.then(function(result){
  console.log('result', result);
});

您似乎也没有处理错误。 then库在这一点上看起来非常原始,所以你应该添加第二个参数:

wrapper.authenticate()
.then(wrapper.getDashboards, onAuthenticateError)
.then(function(result){
  console.log('result', result);
}, onDashboardError);