使用Q Promises链接node.js中的GET请求

时间:2015-04-16 19:27:21

标签: javascript node.js promise q

我试图将一系列GET请求链接在一起。它们是一系列API调用,依赖于之前调用的数据。我对承诺的理解是我应该能够创建一个扁平的.then()链,但是当我试图这样做时,我的函数/ console.logs没有以正确的顺序执行,所以我现在有一个不断增长的金字塔厄运:

var request = require('request');
var deferredGet = Q.nfbind(request);

deferredGet(*params*)
  .then(function(response){
  // process data from body and add it to the userAccount object which I am modifying.
    return userAccount;
  })
  .then(function(userAccount){
    deferredGet(*params*)
      .then(function(response){
        //process data from body and add to userAccount
        return userAccount;
    })
    .then(function..... // There's a total of 7 API calls I need to chain, and it's already getting unwieldy.

我明白你应该回复一个承诺,或许我应该回归deferredGet,但当我试图这样做时,我没有回复任何东西。此外,传递给第一个then的参数是响应,而不是承诺。所以我不知道从哪里开始,但我觉得我做错了。

提前致谢!

1 个答案:

答案 0 :(得分:3)

您确定应该返回deferredGet。但是,要意识到返回的内容仍然是一种承诺。所以你应该继续跟踪.then次电话。

var request = require('request');
var deferredGet = Q.nfbind(request);

deferredGet(*params*)
  .then(function(response){
    // process data from body and add it to the userAccount object which I am modifying.
    return userAccount;
  })
  .then(function(userAccount){
    return deferredGet(*params*);
  })
  .then(function(response){
    // response should be the resolved value of the promise returned in the handler above.
    return userAccount;
  })
  .then(function (userAccount) {
    //...
  });

当您从then处理程序中返回承诺时,Q将使其成为链中的一部分。如果从处理程序返回原始值,Q将生成隐含的承诺,只需立即解析该原始值,就像您在第一个处理程序中看到userAccount一样。

结帐this working example我为你准备了一起:)