2016-10-01 3 views
0

Я новичок в узле и хочу вызвать функцию и определить, следует ли вызывать следующую функцию на основе результатов первой функции. Функции асинхронны, поэтому результаты не сразу известны. Следующий код работает отлично, но теперь я хочу добавить больше асинхронных функций и объединить их все вместе.Q обещание - как его использовать?

var doSomething = require('./custom-module1.js'); //returns a boolean 
var doAnotherThing = require('./custom-module2.js'); //returns a double 

var var1 = process.argv[2]; 
var var2 = process.argv[3]; 
var var3 = process.argv[4]; 

doSomething(var1, var3, function(data) { 
    if (data) { 
     doAnotherThing(var1,var2, function(data){ 
      console.log(var1 + ' is value: ' + data); 
     }); 
    } 
}); 

Я хочу сделать код примерно так, используя обещания.

getListOfStuff() 
.then(
    for(i=0;i<data.length;i++) { 
     doSomething(data[i], var3) 
     .then(
      if (doSomething returns true) { 
      doAnotherThing(data[i], var2) 
      .then(doYetAnotherThing(data[i])) 
      .then(andEvenMoreThingsToBeDone(data[i])) 
      } 
     ); 
    } 
); 

Я прочитал о q и использовал denodefiy, но я не могу понять синтаксис, чтобы заставить его работать. Было бы лучше изменить мои пользовательские модули, чтобы вернуть обещания, чтобы они были неотъемлемо отныне? Я получаю концепцию, но не синтаксис, как я на самом деле это делаю?

Я попытался denodeify, используя следующие две различные обозначения.

var doSomethingDN = Q.denodeify(doSomething); 
var doAnotherThingDN= Q.denodeify(doAnotherThing); 

doSomethingDN(var1, var3) 
.then(
    if(!data) { 
     doAnotherThingDN(var1,var2) 
    } 
); 

И это один

var doSomethingDN = Q.nfbind(doSomething); 
var doAnotherThingDN= Q.nfbind(doAnotherThing); 

doSomethingDN (var1, var3) 
.then(
    if(!data) { 
     doAnotherThingDN(var1,var2) 
    } 
); 

Условный прибудете это неожиданный маркер ошибки. Если я удалю, то оба запускаются, но логический результат doSomething не может контролировать поток программы.

+0

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

+0

"* Было бы лучше изменить мои пользовательские модули, чтобы возвращать обещания, чтобы они были неотъемлемо отныне? *" - Да, определенно – Bergi

+0

Возможно, посмотрите [Как преобразовать существующий API обратного вызова в обещания?] (Http: //stackoverflow.com/q/22519784/1048572) – Bergi

ответ

0

Вам все еще нужно использовать функцию обратного вызова с обещаниями:

doSomethingDN (var1, var3) 
.then(function(data) { 
// ^^^^^^^^^^^^^^^^ 
    if (!data) { 
     return doAnotherThingDN(var1,var2) 
    } 
}); /* 
^ 

Вы получали синтаксическую ошибку, потому что вы положили тело функции прямо в качестве аргумента then.

+0

Оператор if не получает оценку. Я добавил консольный журнал перед возвратом и не получил выход. – Jordan

+0

я последовал за вами ранее предложение и изменил пользовательские модули вернуть обещания так и теперь он работает как этот 'DoSomething (var1, var3) .Затем (функция (ответ) { \t если (! Ответ) { \t \t doAnotherThing (var1, var2) .then (функция (данные) { \t \t \t возвращаемые данные; \t \t});} \t }); 'Мои извинения, я не знаю, как форматировать код, чтобы сделать его более легким для просмотра. – Jordan

Смежные вопросы