【发布时间】:2018-09-19 18:29:07
【问题描述】:
在我的former post 中,通过查看该社区提供的一些示例,我能够解决我的 Promise 问题。我希望这个问题也很容易解决,尽管我无法理解它。我有生以来第一次体验到流利的 PHP 语言是一种负担。
我的代码如下所示:
let getProducts = function(){
countProducts
.then(function(number){
var name = '';
let list = [];
getProductNames(name)
.then(function(names){
names.forEach(function(el){
list.push(el);
});
name = list.pop();
getProductNames(name)
.then(function(names){
names.forEach(function(el){
list.push(el);
});
... and some more code to put the names in a table
getProductNames 函数如下所示:
var getProductNames =
function(name) {
return new Promise(
function(resolve, reject){
xyz.api.checkProducts(name, 1000, function(err, names){
if (err){
reject(err);
} else {
resolve(names);
}
});
}
);
}
这行得通,因为我知道我的产品少于 2000 个,每次检查返回 1000 个产品,所以我必须运行两次 getProductNames 函数。
我正在寻找一种将其变为循环的方法,以便它自动运行所需的运行次数。
api 调用的问题是它需要以产品名称开头。第一次运行没有名称,它返回第一个 1000。第二次运行我需要运行 1 的最后找到的产品名称,运行 3 我需要最后找到的产品名称 2,依此类推。
有不同的方法可以确定是否需要再次运行:
- 将数组长度与生成的 countProducts 数量进行比较
- 通过将生成的 countProducts 数除以 1000 (ceil()) 来确定正手击球次数
- 将最后找到的名称与新的最后找到的名称进行比较
我只是不知道如何循环以及在哪里循环。我假设解决方案是通过添加一个辅助函数找到的,但是当我尝试时我陷入了不可用的值等等。
您不必解决我的问题,但如果有人可以提供所需结构的示例或描述此结构的一些互联网资源,我将不胜感激。我发现的示例不使用以前运行的值。
【问题讨论】:
-
什么是
countProducts?您能确定 API 调用之间的项目数不会改变吗? -
你不能把限制参数从
checkProducts中去掉吗? -
尝试递归,而不是循环。或者使用
async/await语法。 -
您需要从每个
function为它return一个值或承诺,包括then回调函数 -
@Bergi 就像它所说的那样,它是产品的总数。它可能会改变,但我可以处理。我担心的是多次运行。限制不可更改,是对第三方系统的api调用。