如何让3个函数在NodeJS中同步运行

问题描述

第一个问题。从StackOverflow中学到了很多年。只是想不通。

我试图把我的头放在回调,promise和async / await上-我只是没有看到它。有人可以帮助吗?

我只是做不到: 1 ,然后 2 ,然后 3

  1. 下载PDF
  2. 将PDF转换为JPG
  3. 删除PDF
use std::io

解决方法

传统方式是在回调中继续执行。要使代码正常工作,需要进行最小修改:

function getPdf() {
    var file = fs.createWriteStream(orderNo+ ".pdf");
    http.get(targetUrl+token,function(response) {
        response.pipe(file);
        console.log('downloaded');
        makeJpgs(); // CONTINUED HERE!
    });
}
    
function makeJpgs() {
    // 
    exec("magick -density 150 -quality 100% " + orderNo + ".pdf " + previewpath + orderNo + ".jpg",function (err) {
        if (err) {
            console.error(err);
        }
        else {
            deletePdf(); // CONTINUED HERE!
        }
    });
    console.log('converted');
}

function deletePdf() {
    fs.unlink(orderNo+ ".pdf",(err) => {
        if (err) {
            console.error(err); // You can't really throw asynchronously
        }
        else {
            // Deletion process completes here.
            console.log('deleted');
        }
    });
    // console.log('deleted'); // Note: The file haven't even started being deleted here
}

getPdf();

使用Promises,您可以使代码更具可读性:

const util = require('util');
const http = require('http');
const fs = require('fs');
const child_process = require("child_process");
const targetUrl = 'http://domain/fileProxy.ashx?token=';
const previewpath = 'previews/';

var token = '66a7e572-e2fb-4fb4-87a9-6e19d675357f';
var orderNo = '121212';

const exec = util.promisify(child_process.exec);
const unlink = util.promisify(fs.unlink);
const get = function (url) {
    return new Promise(function(ok,fail){
        http.get(targetUrl+token,function(response) {
            response.pipe(file);
            ok();
        })
        .on('error',fail);
    });
}

function getPdf() {
    var file = fs.createWriteStream(orderNo+ ".pdf");
    return get(targetUrl+token);
}
    
function makeJpgs() {
    return exec("magick -density 150 -quality 100% " + orderNo + ".pdf " + previewpath + orderNo + ".jpg");
}

function deletePdf() {
    return unlink(orderNo+ ".pdf",(err) => {
        if (err) {
            throw err;
        }
    });
}

getPdf().then(function(){
    console.log('downloaded');
    return makeJpgs();
}).then(function(){
    console.log('converted');
    deletePdf();
}).then(fuction(){
    console.log('deleted');
});

现在您的函数返回了承诺,您可以使用async / await:

async function main () {
    await getPdf();
    console.log('downloaded');
    await makeJpgs();
    console.log('converted');
    await deletePdf();
    console.log('deleted');
}

main().then('done');

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...