正确的方法来推测Q.Promise

时间:2014-09-09 15:05:24

标签: promise q

我这样做。它似乎适合我,但它可以吗?还有更好的办法吗?

function myPromise(options) {
  return Q.Promise(function(resolve, reject, notify) {
    doSomthingAsync(options, function(resp) {
       notify(resp);
      if (resp.nextPageToken) {
        options.pageToken = resp.nextPageToken;
        myPromise(options).then(resolve, reject, notify);
      } else {
        resolve(resp);
      }
    });
  });
}

注意:我知道可变选项是不明智的。

仅供参考:我不确定,但在ReactiveCocoa中,有一种相同的功能。 -[RACSignal subscribe:] https://github.com/ReactiveCocoa/ReactiveCocoa/blob/1e97af8f5681b3685770eb30faf090e64c293290/ReactiveCocoaFramework/ReactiveCocoa/RACSignal.h#L115-L131

1 个答案:

答案 0 :(得分:1)

  

还有更好的方法吗?

是。 .then(resolve, reject, notify);deferred antipattern

使用明确的then更好地链接可能递归的调用:

function myPromise(options) {
  return Q.Promise(function(resolve, reject, notify) {
    doSomthingAsync(options, function(resp) {
      // if (err) return reject(err);
      notify(resp);
      resolve(resp);
    });
  }).then(function(resp) {
    if (resp.nextPageToken) {
      options.pageToken = resp.nextPageToken;
      return myPromise(options);
    } else {
      return resp;
    }
  });
}

而不是new Q.Promise电话,您可能可以使用其中一个callback-function helper methods