一言两答

时间:2019-06-21 16:45:54

标签: javascript node.js ecmascript-6 es6-promise

我是JavaScript新手。我不知道在一个诺言中可以在哪里使用两个拒绝项。谁能告诉我在一个承诺中有两个拒绝是不好的做法吗?如果是,什么是可选解决方案?

这是我的代码

async handler(ctx) {
                /*
                 * sheet_to_json method converts excel file to JSON format
                */
                let { s3Url, header } = ctx.params;
                return new Promise((resolve, reject) => {
                    request({method: 'GET',  uri: s3Url,encoding: null}, async function(err, res, data) {
                        if(err || res.statusCode !== 200) reject(err);
                        try{
                            const workbook = XLSX.read(data, {type:'buffer'});
                            const sheet_name_list = workbook.SheetNames;
                            let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
                            resolve(result);
                        }
                        catch(error){
                            reject("Invalid File Cointaint");
                        }       
                    })
                });
            }

4 个答案:

答案 0 :(得分:2)

在promise回调中,您可以在多个地方调用reject(err)。只有第一个执行。以后对reject()的调用将被忽略,因为一旦设置了Promise状态,就不能再对reject()resolve()进行调用来更改它。

通常最好的做法是在拒绝时以return结束函数执行或使用else语句,因为通常继续做其他不会解决或拒绝的事情毫无意义,在某些情况下是有害的。

因此,在您的特定情况下,您可以像这样添加return

async handler(ctx) {
    /*
     * sheet_to_json method converts excel file to JSON format
     */
    let {s3Url,header} = ctx.params;
    return new Promise((resolve, reject) => {
        request({method: 'GET', uri: s3Url, encoding: null}, async function(err, res, data) {
            if (err || res.statusCode !== 200) return reject(err); // <==== return added here
            try {
                const workbook = XLSX.read(data, {type: 'buffer'});
                const sheet_name_list = workbook.SheetNames;
                let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
                resolve(result);
            } catch (error) {
                reject("Invalid File Cointaint");
            }
        })
    });
}

或者,您可以添加其他:

async handler(ctx) {
    /*
     * sheet_to_json method converts excel file to JSON format
     */
    let {s3Url, header} = ctx.params;
    return new Promise((resolve, reject) => {
        request({method: 'GET', uri: s3Url, encoding: null}, async function(err, res, data) {
            if (err || res.statusCode !== 200) {
                reject(err);
            } else {           // <======== else added here
                try {
                    const workbook = XLSX.read(data, {type: 'buffer'});
                    const sheet_name_list = workbook.SheetNames;
                    let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
                    resolve(result);
                } catch (error) {
                    reject("Invalid File Cointaint");
                }
            }
        })
    });
}

答案 1 :(得分:1)

是的,您可以在承诺中使用任意数量的reject。只是次品需要处于不同的流程。意味着一个接一个reject接一个reject的呼叫将无法正常工作。因为不会依次呼叫一个resolve

还要确保其他代码不会运行,最好在resolve之前添加return

例如:

reject

答案 2 :(得分:0)

您应该尝试在if else块中保留每个解决方案并拒绝。

if (condition1) {
  resolve(true);
} else if (condition2) {
  reject(false);
} else {
  reject(false);
}

例如,如果您要执行此操作:

if (condition1) {
  resolve(true);
}
reject(false);

您应该改为:

if (condition1) {
  resolve(true);
  return;
}
reject(false);

答案 3 :(得分:0)

使用很多拒绝是没有问题的,它完全取决于您的逻辑,并且是以这种方式使用的。

我唯一建议您更改的是Promise中的try / catch块,当您引发异常时,下一个promise.catch将处理它。

看看:

https://medium.com/datafire-io/es6-promises-patterns-and-anti-patterns-bbb21a5d0918