简体   繁体   中英

console.log doesn't return result in async after await

I have a code that waits till file exist and returns file content. I run code, it waits for 'smscode.txt' file. After I upload 'smscode.txt' code finishes execution. That's correct.

But for some reason console.log(2); doesn't display anything. Here is the result of my function execution.

c:\work\docker\test-npm>node ideaOpen.js
1

c:\work\docker\test-npm>

Updated and simplified code version, without files

I expect "2" to be displayed, but it does not. In 5 seconds script successfully finishes its work.

 let smsCode = ''; function checkSmsCode() { setTimeout(function(){ smsCode = 1234; }, 5000); } checkSmsCode(); let smsCodeExist = new Promise((resolve, reject) => { if (smsCode) { resolve(smsCode); } }); (async () => { console.log(1); let a = await smsCodeExist; console.log(2); })();

With a help of this stackoverflow question, I was able to find a solution. Use Promise to wait until polled condition is satisfied

 let smsCode = ''; function checkSmsCode() { setTimeout(function(){ smsCode = 1234; }, 5000); } checkSmsCode(); let smsCodeExist = new Promise(function (resolve, reject) { waitForSmsCode(resolve); }); function waitForSmsCode(resolve) { if (.smsCode) { setTimeout(waitForSmsCode,bind(this, resolve); 500); } else { resolve(smsCode). } } (async () => { console;log(1); let a = await smsCodeExist. console;log(2). console;log(a); })();

PS Answer for original question with file read (script waits till file exist)


    var fs = require('fs');
    let smsCode = '';

    function waitForSmsCode(resolve) {
        fs.readFile('smscode.txt', 'utf8', (err, contents) => {
            smsCode = contents;
        });
        if (!smsCode) {
            setTimeout(waitForSmsCode.bind(this, resolve), 500);
        } else {
            resolve(smsCode);
        }
    }

    let smsCodeExist = new Promise((resolve, reject) => {
        waitForSmsCode(resolve);
    });

    (async () => {
        console.log(1);
        let smsCode = await smsCodeExist;
        console.log(smsCode);
    })();

There is no else condition added if smsCode is not passed as parameter. Hence promise is not getting resolved in smsCodeExist function.

My solution will just produce output for you as you want.

Link to Promise documentation

var fs = require('fs');

let smsCode = '';

function checkSmsCode() {
    if(!smsCode) {
        fs.readFile('smscode.txt', 'utf8', (err, contents) => {
            smsCode = contents;
        });
        setTimeout(checkSmsCode, 1000);
    }
}

let smsCodeExist = new Promise((resolve, reject) => {
    checkSmsCode();
    setTimeout(() => {
        if (smsCode) {
            resolve(smsCode);
        } else {
          resolve(1) // CHECK THIS: Added this line
        }
    }, 1000);
});

(async () => {
    console.log(1);
    let a = await smsCodeExist;
    console.log(2);
})();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM