在自己内部呼唤同一承诺

时间:2018-05-03 13:15:54

标签: javascript promise

仍然试图围绕承诺及其运作方式。我正在查询Google网站站长API以返回搜索分析数据。我设置了一个承诺,如果我调用它一次返回数据,但我需要根据前一个结果再次调用它。

例如:

startRow = 0;
data = [];

Query(startRow).then((results) => {
  if (results != null) {
    data.push(results)
    startRow++;
    // RUN SAME QUERY AGAIN
  };
});
如果promise返回数据,则 startRow需要增加1然后调用相同的promise(使用更新的startRow)。这是可能的,还是我完全看错了?

2 个答案:

答案 0 :(得分:2)

你不能多次调用同一个Promise,只能创建新的。

startRow = 0;
data = [];

function startQuery() {
    // Generally a good idea to always return Promises,
    // so you can chain them if needed
    return Query(startRow).then(processResults);
}

function processResults(results) {
    if (results == null) return;

    data.push(results);
    startRow++;
    return startQuery();
};

startQuery();

或者,以更紧凑的方式:

startRow = 0;
data = [];

function startQuery() {
    return Query(startRow).then((results) => {
        if (results == null) return;

        data.push(results);
        startRow++;
        return startQuery();
    });
}

startQuery();

答案 1 :(得分:1)

你可以做的是创建一个递归返回特定页面的所有结果的函数,然后调用初始页面值为0的函数:

function queryPaged(pageNum, soFar) {
    return Query(pageNum).then(function (results) {
        return results
            ? queryPaged(pageNum + 1, soFar.concat(results))
            : soFar;
    });
}

queryPaged(0, []).then(function (allResults) {
    console.log(allResults);
});