2016-07-20 9 views
0

Я немного новичок в Javascript, и мне сложно с асинхронным аспектом. Моя программа проверяет значения двух объектов, для которых второй объект не имеет необходимого свойства для завершения проверки. Поэтому я дал обещание получить это значение/свойство (идентификатор), и теперь мне нужно передать это значение ID вместе с функцией проверки. Функция проверки должна просто вернуть true/false, чтобы увидеть совпадение идентификатора. Значение функции проверки передается другой функции, которая затем действует соответствующим образом и при необходимости редактирует вещь. Поэтому я в принципе не могу получить доступ к значению тика вне его скобок. Я включил фрагмент моего кода, где все это происходит, поскольку все это легче визуализировать с ним. Может ли кто-нибудь предоставить мне решение этой проблемы? Любой совет поможет очень! Я хочу как можно больше свести к минимуму модификацию скрипта.Как передать значение обещания другой функции?

var Q = require('q'); 

    getID = function(instance, person, callback){ 
      var = deferred = Q.defer(); 
      var url = 'www.blah.com'; 
      var options = { 
       'url': url 
      }; 

      request.get(options, function(error, response, body){ 
       if (error) { 
        deferred.reject(error); 
       }else{ 
        var res = body; 
        var obj = JSON.parse(res); 
        var id = obj.id; 
        deferred.resolve(id); 
       } else deferred(obj); 
      }); 


    check = function(instance, thing1, thing2){ 
     var tick = true; 
     getID(instance, thing2).then(function(id)){ 
      var id_1 = thing1.id; // thing1 passed into check with ID 
      var id_2 = thing2.id; // thing 2 now has id attached to it 
      if(id_1 == id_2){ 
       tick = true; // VALUE 1 
      }else{ 
       tick = false; // VALUE 2 
     }); 

     // NEED VALUE 1 OR 2 OF TICK HERE 

     if(thing1.name == thing2.name){ 
      tick = true; 
     else{ 
      tick = false; 
     } 

     // similar checks to name but with ADDRESS, EMAIL, PHONE NUMBER 
     // these properties are already appended to thing1 and thing 2 so no need to call for them 

    }; 

    editThing = function(instance, thing, callback){ 

     var checked = check(instance, thing1, thing2); 
     if(checked){ 
      // edit thing 
     }else{ 
      // don't edit thing   
    }; 
+0

ли 'функция getID' возвращение' deffered'? Его нет в вашем фрагменте кода. – Victory

+0

var Q = require ('q'); должен быть на самом верху! – pokemongirl1234

+0

Это не отвечает на вопрос: вы возвращаете 'отложенный' объект в' getID', чтобы его можно было использовать в 'check'? – Victory

ответ

1

Поскольку вы делаете обещание работы предстоит сделать, и вы должны выход из этой работы, вам нужно пройти, что обещают по коду, который хочет окончательный вывод.

Я не буду пытаться переписать код из вашего поста, поэтому позвольте мне перефразировать:

getThing = function(thing){ 
    var deferred = Q.defer(); 
    ... 
    request.get(options, function(error, response, body){ 
    if (error) { 
     deferred.reject(error); 
    } else { 
     ... 
     deferred.resolve(thingMadeFromResponse); 
    } 
    }); 
    return deferred; 
} 

check = function(thingWeHave, thingWeNeedFetched){ 
    return getThing(thingWeNeedFetched).then(function(thingWeFetched)){ 
    // check logic 
    checked = thingWeHave.id == thingWeFetched.id; 
    ... 
    return checked; 
    }); 
}; 

editThing = function(instance, thing, callback){ 
    check(thingWeHave, thingWeNeedFetched).then(function(checked) { 
    if(checked){ 
     // edit thing 
    }else{ 
     // don't edit thing 
    } 
    }); 
}; 
+0

для проверки функции, мне нужна вещь и вещь 2, поддерживает ли это это решение? Я попробовал, и программа не выполняется. – pokemongirl1234

+0

Не совсем ясно, что вы ожидаете уже иметь под рукой, и что вам нужно, чтобы получить от blah.com, поэтому трудно понять, что именно вам нужно пройти. Я отредактирую свой ответ с предположением, что у вас уже есть один объект, и пытаюсь сравнить его с данными, полученными из blah.com ... – Will

+0

Итак, у меня есть obj1, это нормально, но оно передается через editThing, чтобы проверить функция. Мне нужно вернуть идентификатор из getID, для obj2, а затем передать BOTH-объекты через серию проверок – pokemongirl1234

-2

Promises

«thenable» является объектом или функция, которая определяет то метод.

+0

Итак, не подходит ли здесь способ получения идентификатора? – pokemongirl1234

+0

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

+0

Есть ли способ получить значение без polyfill? Мне трудно понять, что вы подразумеваете под этим. – pokemongirl1234