【发布时间】:2018-09-05 22:23:00
【问题描述】:
我有一个正在从 Web 服务检索数据的 Zapier 触发器(应用程序)。 Web 服务以 500 个项目的块形式返回数据,每个项目包含一个 UNIX 时间戳和一个 Web 服务参数('since')指定您要检索的数据块的开始时间。
为了使其正常工作,我需要按顺序检索数据块,在前一个块中检索的数据允许我找到下一次 Web 服务调用的 'since' 值。
我目前使用的代码:
const fetchItems = (z, bundle, since) => {
return z.request({
url: URL_PATH + ':' + URL_PORT + '/v1/items',
params: {
since: since
}
}).then(( response) => {
if (response.status === 401) {
throw new Error('The authentication has expired.');
} else if (response.status !== 200){
throw new Error('Status ' + response.status + ' returned.');
}
return response.json;
});
};
const processItems = (z, bundle) => {
var jsonAll = [];
var since = 0;
var jsonLength = ITEM_BLOCK_SIZE;
return (function loop(i) {
if (jsonLength === ITEM_BLOCK_SIZE) {
new Promise((resolve, reject) => {
fetchTransactions(z, bundle, since).then((json) => {
since = json[json.length - 1].modified;
jsonLength = json.length;
for (j = 0; j < json.length; j++) {
jsonAll.push( json[j]);
}
resolve();
});
}).then(loop.bind(null, jsonLength));
} else {
return jsonAll;
}
})(0);
}
module.exports = {
...
operation: {
...
perform: processItems,
...
}
};
我遇到的问题是,当我运行此代码时,Zapier 返回以下错误:Results must be an array, got: undefined, ()
fetchItems() 函数工作正常,它返回指定 'since' 值的数据块。
我在处理 Promise 方面的经验有限,因此我们将不胜感激。
【问题讨论】:
-
fetchTransactions未定义。应该是...Items? -
你从哪里得到错误?您没有错误处理程序 (.`catch(err) => {}) 来捕获这些错误。
-
哦,我开始发现您的代码有问题。您收到的此错误不在此功能范围内。它来自调用
processItems(或perform,因为它公开为)的代码。问题是您没有返回等待的承诺,而且您也没有以任何方式将创建这些承诺的操作排队。 -
感谢您的快速回复。是的,它应该是 fetchItems,我的错,对不起。你能给我任何我需要做的改变的例子吗,我对 Promise 的了解有限,这段代码来自我在互联网上找到的例子。
-
在您发表评论前 2 分钟添加了一个答案 ;-)
标签: javascript promise zapier