如何在节点js中运行同步执行?

时间:2018-02-05 21:45:12

标签: node.js

我正在尝试在节点js中运行同步执行除了使用事件和异步之外还有什么办法可以做到这一点,因为那些对我不起作用吗?

 for (i=1; i < response.payload.parts.length; i++) {
     if(response.payload.parts[i]!==undefined && response.payload.parts[i].filename!==undefined) {
         console.log("5")
         myEmitter.emit('trah', auth, 'me', response.id, response.payload.parts[i].body.attachmentId, response.payload.parts[i].filename,response.payload.parts[i].mimeType);
     }
}

var ul = fs.readdir('content/'+response.id,(err) => {
    if(err) { console.log(err) }
})

console.log("9")

if(ul!==undefined) {
    console.log('mahiech lehné')

    for (var i=0; i<ul.length; i++) {
        if(mime.getType(ul[i]).substring(0,5)==='image') {
            console.log("10")

            // console.log(te)
            te+='<a href="http://localhost:3000/content/?id='+response.id+'&atch='+ul[i]+ '"><img border="0"  src="http://localhost:3000/content/?id='+response.id+'&atch='+ul[i]+'" width="100" height="100"></a>'
       }

       console('11----'+i)
       fs.writeFile(__dirname+'/test.txt',te)
   }
}
}
fs.writeFile(__dirname+'/test1.txt',te)
console.log("12")
res.end(buildres(te))

这是我的'trah'事件

myEmitter.on('trah', (auth,userId,messageId,id,name,type) => {
    gmail.users.messages.attachments.get({
            auth: auth,
            userId: userId,
            messageId: messageId,
            id: id},
        function (err, res) {
            if (err) {
                console.log('The API returned an error: ' + err);
                return;
            }
            if (!res) {
                console.log('no resposnse found')
            }
            if (res===undefined) {
                console.log('No messages found.');
            }
            if (res) {
                console.log("6")
                if(type.substring(0, 5)==='image'){
                    res.data = res.data.replace(/_/g, "/");
                    res.data = res.data.replace(/-/g, "+");
                    console.log("7")
                    fs.writeFile(__dirname + '/content/' + messageId + '/'+name,res.data,'base64',(err)=>{console.log(err)})
                }
                else {
                    console.log("8")
                    fs.writeFile(__dirname + '/content/' + messageId + '/' + name, utf8.decode(base64.decode(res.data)),(err)=>{console.log(err)})
                }
            }
        })
});

这是我得到的执行顺序,因为我的执行依赖于每个有序语句,我无法使其正常工作 1 2 3 4 五 9 12 6 8

1 个答案:

答案 0 :(得分:1)

大多数文件系统调用都具有同步等效项。例如,fs.readdir的同步版本为fs.readdirSync。请参阅文档:https://nodejs.org/api/fs.html

虽然您可以调用这些功能的同步版本,但实际上并不推荐。有关原因的更多信息,请参阅此帖子:Node.js sync vs. async