node.js pg-promise 和 API 的分页

node.js pg-promise and pagination from API

查看 https://github.com/vitaly-t/pg-promise/wiki/Data-Imports 有一个关于如何使用它进行导入的非常详细的文档。

然而,虽然这适用于演示场景,但我不知道如何将它应用到我的案例中。

当我进行网络调用时,我得到了实际的 JSON 数据和 header 中的一个参数,它为我提供了下一页的值(可以是日期或字符串或数值)。

在示例中,它表示:

db.tx('massive-insert', t => {
    return t.sequence(index => {
        return getNextData(index)
            .then(data => {
                if (data) {
                    const insert = pgp.helpers.insert(data, cs);
                    return t.none(insert);
                }
            });
    });
})
    .then(data => {
        console.log('Total batches:', data.total, ', Duration:', data.duration);
    })
    .catch(error => {
        console.log(error);
    });

在这种情况下,sequence(index 将使用似乎递增 +1 的索引。 但就我而言,

function getNextData(nextPage) {
    //get the data for nextPage
    .....
   //get the nextPage if exists for future use
   nextPage = response.next;

   resolve(data);
}

我的问题是,如何在这个例子中用 nextPage 替换 index,因为每个新的 Promise 都需要使用前一个的 nextPage

稍后编辑:如果我想从 nextPageInfo 的某个值获取信息?

例如:

db.any('Select value from table')
      .then(function(value) {

var data = value; //not working

db.tx('massive-insert', t => {
    return t.sequence((index, data) => {
        return getNextData(index, data)
            .then(a => {
                if (a) {
                    const insert = pgp.helpers.insert(a.data, cs);
                    return t.none(insert).then(() => a.nextPageInfo);
                }
            })
    });
})
    .then(data => {
        // COMMIT has been executed
        console.log('Total batches:', data.total, ', Duration:', data.duration);
    })
    .catch(error => {
        // ROLLBACK has been executed
        console.log(error);
    })

}

在这个问题之后,我扩展了文章 Data Imports with the new extras 部分,它为您提供了您需要的示例。文章中复制的例子:

function getNextData(t, index, nextPageInfo) {
    // t = database transaction protocol

    // NOTE: nextPageInfo = undefined when index = 0

    return new Promise((resolve, reject) {

        /* pull the next data, according to nextPageInfo */            

        /* do reject(error) on an error, to ROLLBACK changes */
    
        if(/* there is still data left*/) {
            // if whateverNextDetails = undefined, the data will be inserted,
            // but the sequence will end there (as success).
            resolve({data, nextPageInfo: whateverNextDetails});
        } else {
            resolve(null);
        }   
    });
}

db.tx('massive-insert', t => {
    return t.sequence((index, data) => {
        return getNextData(t, index, data)
            .then(a => {
                if (a) {
                    const insert = pgp.helpers.insert(a.data, cs);
                    return t.none(insert).then(() => a.nextPageInfo);
                }
            })
    });
})
    .then(data => {
        // COMMIT has been executed
        console.log('Total batches:', data.total, ', Duration:', data.duration);
    })
    .catch(error => {
        // ROLLBACK has been executed
        console.log(error);
    });

请注意,由于我们将 getNextData 的结果链接到 nextPageInfo 的值,那么如果其值为 undefined,它将进行下一次插入,但随后将结束序列(成功)。