【问题标题】:Nodejs promise child resolve parent promiseNodejs 承诺子解决父承诺
【发布时间】:2019-09-29 15:01:53
【问题描述】:

我目前有两个承诺,而孩子则依赖于父母的成功。我想从子承诺“然后”中解决/拒绝父承诺。

const UserApplicaiton = require('../applications/user'), User = new UserApplicaiton();          

class CheckParams {
    constructor() { }

    required(params, required_params) {
        return new Promise(function(resolve, reject, onCancel) {
            // set i
            var i;

            // set missed_required_params
            var missed_required_params = [];

            // check for userCredentials if user_id is required param, convert from credentials to user_id
            if(required_params.includes("user_id")){
                // set as const
                const user_key = String(params.userCredentials.user_key);
                const user_secret = String(params.userCredentials.user_secret);

                // check in database
                User.info(user_key, user_secret).then((data) => {
                    // if data
                    if(data) {
                        // add user_id to params
                        params.user_id = data[0]._id;

                        // loop params
                        for(i = 0; i < required_params.length; i++){
                            // if params that's required is there, else add to array
                            if(!(required_params[i] in params)){
                                missed_required_params.push(required_params[i]);
                            }
                        }

                        if(missed_required_params.length !== 0){
                            reject("Missed parameters: " + missed_required_params);
                        }else{
                            resolve(params);
                        }
                    }
                }).catch((err) => {
                    reject(err);
                });
            }else{
                // loop params
                for(i = 0; i < required_params.length; i++){
                    // if params that's required is there, else add to array
                    if(!(required_params[i] in params)){
                        missed_required_params.push(required_params[i]);
                    }
                }

                if(missed_required_params.length !== 0){
                    console.log("hello");
                    return reject("Missed parameters: " + missed_required_params);
                }else{
                    console.log("hello2");
                    resolve(1);
                }
            }
        });
    }
}

module.exports = CheckParams;

第二个promise的目标是根据响应添加到一个对象,然后解析父promise,后面代码会用到。

这根本不起作用。异步并没有真正的帮助。

【问题讨论】:

  • 什么不起作用?在// fetch from database 之后你会打电话解决吗
  • 解析没有解析父 Promise。我调用// but that doesn't work 下的解析,这将使其运行直到 cURL(使用 express)终止。我的目标是在这种状态下解决父承诺@gp。
  • 您应该调用 resolve() 或更好的名称,例如 resolve(obj),而不是 resolve(resolve)。您的外部 then 回调需要一个 data 参数,因此您应该相应地履行您的承诺。
  • @Bergi 这对父母的承诺不起作用
  • 同时避免Promise constructor antipattern!外面的new Promise是不必要的,你should do conditionals without it

标签: node.js promise


【解决方案1】:

您的问题似乎是 if(data) { 缺少一个 else 子句,您也可以在其中解决承诺。避免Promise constructor antipattern 也有助于避免此类错误。

required(params, required_params) {
    var promise;
    if (required_params.includes("user_id")) {
        const user_key = String(params.userCredentials.user_key);
        const user_secret = String(params.userCredentials.user_secret);

        promise = User.info(user_key, user_secret).then((data) => {
            if (data) {
                params.user_id = data[0]._id;
            }
            // else
            //    throw error? keep user_id undefined?
        })
    } else {
        promise = Promise.resolve();
    }
    return promise.then(() => {
        var missed_required_params = [];
        for (var i = 0; i < required_params.length; i++) {
            if (!(required_params[i] in params)) {
                missed_required_params.push(required_params[i]);
            }
        }
        if (missed_required_params.length !== 0) {
            throw new Error("Missed parameters: " + missed_required_params);
        } else {
            return params;
        }
    });
}

【讨论】:

  • 谢谢,问题是我稍后需要“参数”数据。当我尝试获取这个(var paramData = CheckParams.required(req.body, requiredParams))时,它返回Promise { &lt;pending&gt; },并且它不能被使用,因此我在顶部使用了一个promise并且需要解析父级。您对我如何解决此问题有任何想法吗?我的想法是:CheckParams.required(req.body, requiredParams).then((data) =&gt; {,然后是我可以使用“数据”的整个内部
  • 是的,required 方法是异步的,所以它总是必须返回一个承诺(就像我的答案中的代码一样 - 你不需要 new Promise)。实际上,您必须在调用站点上将其与 .then() 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 2021-11-26
  • 2015-06-24
  • 2022-01-22
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多