我尝试配置后端工厂以使用 Amazon Products Api 获取数据。
这是我在nodejs中执行的脚本:
var amazon = require('amazon-product-api');
var client = amazon.createClient({
awsId: 'ID',
awsSecret: 'sectret',
awsTag: 'tag',
});
// SERVER
// var Promise = require('bluebird');
var koa = require('koa');
var router = require('koa-router')();
router.get('/node/:index', function* () {
this.body = yield client.browseNodeLookup({
browseNodeId: this.params.index,
});
});
router.get('/', function* (ctx, next) {
var node = yield client.browseNodeLookup({
browseNodeId: 1063498,
});
this.body = node;
});
var app = koa();
app.use(router.routes()).use(router.allowedMethods());
app.listen(8005);
在前端,我使用 bluebird.js 的 Promise.map() 来映射亚马逊的产品 Node 数组。在函数的最后,我希望将数组中的链接(字符串)转换为对象(通过 API 获取)。 这是函数:
someFn(links) { // links is an array of node IDs
return Promise.map(links, (link) => {
var link = link;
if (typeof link === "object" || level > 1) {
return link;
} else {
return loadUrl({
url: 'http://localhost:8005/node/'+link,
action: 'json',
}).then((res) => {
if (isJSON(res)) {
return new Category(res); // transform string to object
} else {
return link;
}
});
}
});
}
Amazon 最多允许 10 个查询,这就是为什么我需要运行该函数几次或循环它以获取数组中每个字符串的对象。
想法是在后端等待成功答案或重复查询(yield client.browseNodeLookup) 或者只传递 Node ID 数组并获取每个 Node ID 的 JSON 作为结果。
我对nodejs服务器和路由配置没有太多经验,所以你能帮我正确配置它吗?
最佳答案
我仍然没有找到使用后端执行任务的解决方案,但我更新了 loadUrl 函数。该函数会自行运行,直到检索到成功的答案:
function loadUrl(options) {
var options = options;
return new Promise((resolve, reject) => {
$.post('/', options).done((result) => {
if (result != 'Internal Server Error') {
resolve(result);
} else {
(function run(x) {
var x = x || 0;
// 300 - calls limit
// for me 100 is enough
if (x <= 300) {
setTimeout(function() {
$.post('/', options).done((result) => {
if (result != 'Internal Server Error') {
resolve(result);
} else {
console.log('call', x);
run(x+1);
}
});
}, 100);
} else {
resolve(result);
}
})();
}
});
});
}
据我了解, $.post() 的答案有时间限制,这就是我遇到问题的原因。数据是由后端工厂获取的,但是我的前端脚本还没有准备好等待它,就被停止了。
关于javascript - 如何在nodejs路由器中使用Promise和yield?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41462250/