gpt4 book ai didi

javascript - 递归调用 Promise 函数

转载 作者:行者123 更新时间:2023-11-28 17:34:44 25 4
gpt4 key购买 nike

我正在尝试递归调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com