承诺执行错误的订单

时间:2018-08-13 18:16:04

标签: javascript node.js

Hello Im链接有希望,但即时获取的结果不是Im期望的

下面的代码:

createFile(event.body)
        .then(() => readFile()) 
        .then((data) => uploadToS3(data))
        .then(() => deleteTmp())
        .catch(err => console.log(err));

和功能:

async function createFile(fileBinary) {
    return await fs.writeFile(TMP_FILE, fileBinary, 'binary', (err) => {
        if (err) {
            throw {error: 'File upload error_stage1'}
        }
        return;
    });
}

async function readFile() {
return await (fs.readFile(TMP_FILE, (err, data) => {
    if (err) {
        console.log(err)
        throw {error: 'File upload error_stage2'}
    }
    console.log('read file')
    return data;
}));
}

async function uploadToS3(data) {
    console.log('upload s3')
    const uploadParams = {Bucket: myBucket, Key: myKey, Body: data};
    return await s3.putObject(uploadParams, function (err, data) {
        if (err) {
            throw {error: 'File upload error_stage3'}
        }
        return data;
    });
}

async function deleteTmp() {
    fs.unlink(TMP_FILE, (err) => {
        if (err) {
            throw {error: 'File upload error_stage3'}
        }
    })
}

console.logs:

upload s3
read file

因此,从控制台日志中我们可以看到,函数uploads3在读取文件之前被执行,这与链顺序相反。我在这里想念什么?

3 个答案:

答案 0 :(得分:2)

ReadFile似乎正在返回一个诺言,稍后将执行该请求,而uploadToS3不返回一个诺言,因此它将在调用中执行。

我没有设置测试环境,但是也许您想执行以下操作:

=SUMIF($A:$A,$B14,BD:BD)

答案 1 :(得分:1)

您的readFile函数返回一个Promise,无需等待文件被读取即可解决,这是因为您使用过Promise.resolve()

您需要返回一个新的Promise,在读取文件后即可解决。 例如:

function readFile() {
    return new Promise((resolve, reject) => {
       fs.readFile(TMP_FILE, (err, data) => {
           if (err) {
               console.log(err)
               throw {error: 'File upload error_stage2'}
           }
           console.log('read file')
           resolve(data);
       })
    })
}

uploadToS3中,您有这个return await s2.putObject....,因为s3.putObject不返回承诺,所以它不起作用。您必须执行类似的操作才能等待文件上传:

function uploadToS3(data) {
    const uploadParams = {Bucket: myBucket, Key: myKey, Body: data};
    return new Promise((resolve, reject) => {
        s3.putObject(uploadParams, function (err, data) {
            if (err) {
                throw {error: 'File upload error_stage3'}
            }
            resolve(data);
        })
    });
}

答案 2 :(得分:0)

好像您正在将对返回Promises的函数的链接调用与异步函数混在一起。

粘在另一个上,你应该没事。

A:使所有功能异步,然后简单地依次调用它们

B:让所有函数都返回Promises