2016-01-20 2 views
0

Итак, я вызвал к жизни эту мерзость, и я не мог за свою жизнь задуматься о том, как ее оптимизировать таким образом, чтобы я мог правильно управлять этой цепочкой с помощью Promise.all/Promise.join.Переписывая эту цепочку обещаний frankenstein

Кто-нибудь может указать мне в правильном направлении? Возможно, сначала следует отделить эти методы.

Любое понимание оценено.

getOpenIDConf: function() { 
 
    return client 
 
    .getAsync('openId') 
 
    .then(
 
     function(result) { 
 
     if (!result) { 
 
      return request 
 
      .getAsync({ 
 
       url: 'https://accounts.google.com/.well-known/openid-configuration', 
 
       json: true 
 
      }).spread(
 
       function(response, body) { 
 
       var result = JSON 
 
        .stringify(body); 
 
       client.setAsync('openId', 
 
        result).then(
 
        function() { 
 
        return result; 
 
        }); 
 
       }); 
 
     } else { 
 
      return result; 
 
     } 
 
     }); 
 

 
},

[EDIT] Чтобы уточнить, я использую Bluebird

+0

ли это на самом деле работает? Вы никогда не сможете вернуть результат обещания. Вы можете вернуть только обещание. – slebetman

+0

Кажется, я получаю только мой результат –

+0

Вы имели в виду 'client.setAsync (...' внутри 'spread' callback? – acbabis

ответ

2

Рефакторинг немного и изменение стиля кода дает это.

getOpenIDConf:() => client.getAsync('openId').then(result => 
 
    result || request.getAsync({ 
 
     url: 'https://accounts.google.com/.well-known/openid-configuration', 
 
     json: true 
 
    }).get(1).then(JSON.stringify).then(result => 
 
     client.setAsync('openId', result).return(result); 
 
    ) 
 
) 
 
},

+0

Так что другие t Если if/else, код «хорошо» с точки зрения чистоты? Был в основном обеспокоен (ab) использованием обещаний неправильно. –

+2

@KevinToet Собственно, if/else также является вопросом предпочтения. Вы не злоупотребляли обещаниями, ИМО. Побочное злоупотребление - это размножение множества обратных вызовов, когда вам это не нужно. – acbabis

+0

Что это за лямбда-аннотация, которую вы используете? Затмение бросает посадку. Не могли бы вы также объяснить get (1)? –

1

Несколько особенностей хорошей библиотеки обещание (не уверен, какой из них вы используете) является то, что вы можете цепи обетования, как так:

doSomething(function(result) { 
    return doSomethingElse(); 
}).then(function(result2) { 
    return doSomethingElseAgain(); 
}).then(function(result3) { 
    // It all worked! 
}).catch(function() { 
    // Something went wrong 
}); 

Или вы можете ждать набора их завершения:

var promiseArray = []; 
promiseArray.push(doSomething()); 
promiseArray.push(doSomethingElse()); 
promiseArray.push(doSomethingElseAgain()); 

Promise.all(promiseArray).then(function() { 
    // It all worked! 
}).catch(function() { 
    // Something went wrong 
}); 

Надеюсь, что это информативно.

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