javascript - 递归调用 Promise 函数

标签 javascript recursion promise

我正在尝试递归调用 Promise 函数。

以下调用 service.getSentenceFragment() 从句子中返回最多 5 个字母,即“helloworld”中的“hello”。提供 nextToken 值作为调用的参数会返回序列中接下来的 5 个字母。即“世界”。以下代码返回“hellohelloworldworld”并且不会登录到控制台。

var sentence = '';
getSentence().then(function (data)) {
    console.log(sentence);
});

function getSentence(nextToken) {
    return new Promise((resolve, reject) => {
        getSentenceFragment(nextToken).then(function(data) {
            sentence += data.fragment;
            if (data.nextToken != null && data.nextToken != 'undefined') {
                getSentence(data.NextToken);
            } else {
                resolve();
            }
        }).catch(function (reason) {
            reject(reason);
        });
    });
}

function getSentenceFragment(nextToken) {
    return new Promise((resolve, reject) => {
        service.getSentenceFragment({ NextToken: nextToken }, function (error, data) {
            if (data) {
                if (data.length !== 0) {
                    resolve(data);
                }
            } else {
                reject(error);
            }
        });
    });
}

最佳答案

因为当你这样做时:

getSentence(data.NextToken);

新的 Promise 链启动,当前链永远保持挂起状态。所以可以这样做:

getSentence(data.NextToken).then(resolve, reject)

...但实际上你可以将整个事情美化为:

async function getSentence(){
  let sentence = "", token;

  do {
   const partial = await getSentenceFragment(token);
   sentence += partial.fragment;
   token = partial.NextToken;
  } while(token)

  return sentence;
}

并注意 getSentenceFragment 中的这个陷阱 - 如果 data 为真,但 data.length 为 0,则您的代码将进入死胡同并且 Promise 将超时

// from your original getSentenceFragment...
if (data) {
  if (data.length !== 0) {
    resolve(data);
  }
  /* implicit else: dead end */
  // else { return undefined }
} else {
  reject(error);
}

相反,使用 && 组合两个 if 语句,现在我们的 Promise 将始终解决或拒绝

// all fixed!
if (data && data.length > 0)
  resolve(data);
else
  reject(error);

关于javascript - 递归调用 Promise 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49387346/

相关文章:

javascript - &#x00A0 并且无法在 iPad 上运行

javascript - 尝试从 JS 访问 Flash 电影在 FF 中有效,但在 IE 中无效

javascript - 异步关系上的 Ember 数据计算属性

javascript - 关于内容分发网络 CDN 的问题

javascript - 将EventListener 添加到Javascript 中的文章元素

haskell - 在 Haskell 函数定义的参数符号之间使用冒号有什么作用?

计算 e^x 的 Haskell 函数

python - 使用递归的生成器对象

javascript - 在自定义 promise 上使用异步等待

node.js - Bluebird 在源代码中抛出异常