首页 > 解决方案 > Nodejs 承诺子解决父承诺

问题描述

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

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的目标是根据response添加到一个对象,然后解析父promise,后面代码会用到。

这根本行不通。异步并没有真正帮助。

标签: node.jspromise

解决方案


您的问题似乎if(data) {是缺少一个else您也可以解决承诺的条款。避免Promise构造函数反模式也有助于避免此类错误。

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;
        }
    });
}

推荐阅读