Promise.then () но функции запускают async

Я новичок в Javascript и занимаюсь сканером, я создал 4 Promise, поскольку они

var openConfig = new Promise((resolve, reject) => {
  fs.readFile('./config.json', (err, data) => {
    if (err) throw err;
    config = JSON.parse(data);
    client = new MsTranslator({
      client_id: config.translatorId,
      client_secret: config.translatorSecret
    }, true)
    resolve();
  })
})

var openFile = new Promise((resolve, reject) => {
  console.log('Opening file...')
  fs.readFile('./writing/writing.json', (err, data) => {
    if (err) throw err;
    writing = JSON.parse(data);
    console.log('Done parsing file');
    resolve();
  })
})

var ask = new Promise((resolve, reject) => {
  var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  })
  rl.question('Which lesson do you want to add? ', (ans) => {
    lessonId = ans;
    rl.close();
    resolve();
  })
})

var createLesson = new Promise((resolve, reject) => {
  console.log('Now processing lesson ' + lessonId);
})

openConfig . затем (() => { return openFile ; }) . затем (() => { return ask ; }) . затем (() => { return createLesson ; }) вызовите первое обещание

Opening file...
Which lesson do you want to add? Now processing lesson undefined
Done parsing file

но по мере запуска, консольное шоу

function p1 (data) {
    return new Promise(function (resolve, reject) {
        resolve(Object.assign(data, {a:1}));
    });
}

function p2 (data) {
    return new Promise(function (resolve, reject) {
        resolve(Object.assign(data, {b:2}));
    });
}

function p3 (data) {
    return new Promise(function (resolve, reject) {
        resolve(Object.assign(data, {c:3}));
    });
}

p1({z:0})
.then(p2)
.then(p3)
.then((data)=>console.log(data))

который я понял, так как мои обещания ошибочны, а моя функция работает async. Можете ли вы помочь мне исправить это?

Спасибо.

javascript,node.js,promise,

0

Ответов: 2


0 принят

Вместо того, чтобы назначать новые обещания vars (они запускаются сразу после их создания), вы должны обернуть их функциями, которые, в свою очередь, возвращают новое обещание

Чтобы помочь вам понять, приведен упрощенный пример:

{ z: 0, a: 1, b: 2, c: 3 }

Это приводит к .catch()

См. Здесь, если вы хотите немного поэкспериментировать с приведенным выше: https://repl.it/DwNB/0


В отдельном примечании, если вы используете обещания, вы должны также обрабатывать ошибки в цепочке в финале, throwа не синхронно rejectна полпути. Для этого thenнужен обратный вызов!


2

Обещания не называются. В вашей thenцепочке вы их только последовательно ожидаете, но задачи уже начались, когда вы создали обещания. Если вы хотите упорядочить действия, поместите их в функции.

Кстати, ваш код содержит несколько типичных ошибок. Не используйте глобальные переменные и всегда обещайте на минимально возможном уровне:

function openFile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile('./config.json', (err, data) => {
      if (err) reject(err); // never `throw err` in non-promise callbacks!
      else resolve(data);
    });
  });
}
function openJSON(path) {
  return openFile(path).then(JSON.parse);
}
function openConfig(path) {
  return openJSON(path).then(config =>
    new MsTranslator({
      client_id: config.translatorId,
      client_secret: config.translatorSecret
    }, true)
  )
}
function ask(question) {
  return new Promise((resolve, reject) => {
    var rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    })
    rl.question(question, ans => {
      rl.close();
      resolve(ans); // always resolve to *something*
    });
  });
}

readConfig('./config.json')
.then(client => {
  console.log('Opening file...')
  return openJSON('./writing/writing.json');
})
.then(writing => {
  console.log('Done parsing file');
  return ask('Which lesson do you want to add? ');
})
.then(lessonId => {
  console.log('Now processing lesson ' + lessonId);
});
JavaScript, Node.js, обещание,
Похожие вопросы