javascript - 如何在nodejs路由器中使用Promise和yield?

标签 javascript node.js amazon-web-services

我尝试配置后端工厂以使用 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/

相关文章:

javascript - 如何使用 javascript 在 html 文本框旁边制作自动行号?

javascript - jquery not() 不删除 child

javascript - .addNumberOption 错误(斜杠命令)

amazon-web-services - Terraform 可以通过remote_exec 命令设置变量吗?

java - AWS - 如何使用 aws-java-sdk-iam 在 JAVA 中获取用户 MFA 启用/禁用值?

javascript - 在 angularjs 中访问 JSON 元素

javascript - 在 D3 中收集网络图的一些数据。我应该如何格式化它?

javascript - 在 Meteor 中单击个人资料页面上的编辑时显示表单

node.js - 为什么要转译 Node.js 后端代码?

heroku - HIPAA 合规性云服务器设置