2014-11-10 2 views
0

Есть ли хороший шаблон дизайна для использования обещаний, в то же время поддерживающий цепочку? Например, допустим, что у нас есть что-то вроде:Сочетание обещаний и цепочки

function Foobar() { 
    this.foo = function() { 
    console.log('foo'); 
    return this; 
    }; 

    this.bar = function() { 
    console.log('bar'); 
    return this; 
    }; 
} 

var foobar = new Foobar(); 
foobar.foo().bar(); 

Если вместо этого мы изменяем методы использовать обещание, например,

function Foobar() { 
    this.foo = function() { 
    var self = this; 
    return new Promise(function (resolve, reject) { 
     console.log('foo'); 
     resolve(self); 
    }); 
    }; 
    ... 
} 

Есть хороший способ сделать что-то вроде:

var foobar = new Foobar(); 
foobar.foo().bar().then(function() { 
    // do something 
}); 
+1

Вы ищете 'Promise.all'? – elclanrs

+0

Вы не можете вернуть оба 'this' для цепочки и возвратить обещание, если вы не сделаете свой собственный объект в обещании (который имеет некоторые виды использования, но обычно это не хороший подход). Таким образом, вы обычно выбираете тот или иной способ возврата для определенного метода. Методы, которые запускают асинхронную операцию и, таким образом, создают обещание, вернут обещание. Другие методы, у которых не было другого возвращаемого значения, вернули бы «это» для цепочки. – jfriend00

ответ

4

Если вместо этого мы изменяем методы использовать обещание, например,

this.foo = function() { 
    var self = this; 
    return new Promise(function (resolve, reject) { 
    … 
    resolve(self); 
    }); 
}; 

Я бы рекомендовал не делать этого. Это просто требует неприятностей. Если ваш экземпляр (или его модификация) является результатом вашего вычисления, то каково состояние вашего объекта (предположим, вы используете OOP для инкапсуляции состояния) во время этого вычисления? Что произошло, если этот (или любой другой) метод вызывается из другого процесса (поток) оборот цикла события? Вам нужно будет спуститься по всей кроличьей ...

Постарайтесь использовать функциональное программирование, насколько сможете.

Есть хороший способ сделать что-то вроде:

new Foobar().foo().bar().then(function() { 
    // do something 
}); 

Да, но вы должны использовать .then после каждого вызова:

new Foobar().foo().then(function(foobar) { 
    return foobar.bar(); 
}).then(function(barresult) { 
    // do something 
}); 

Синяя птица библиотеки (как и некоторые другие), даже имеет функцию полезности для этого .call(). Таким образом, вы могли бы сделать

new Foobar().foo().call("bar").then(function(barresult) { 
    // do something 
}); 
+0

Также стоит упомянуть, что OP не должен использовать обещания для задачи синхронизации. За исключением этого очень твердого ответа :) –

+0

Конечно, но я предполагаю, что у него действительно есть задача async, скрытая под его псевдокодом :-) – Bergi

1

Просто использовать потом.

function Foobar() { 
    this.foo = function() { 
    var self = this; 
    return new Promise(function (resolve, reject) { 
     console.log('foo'); 
     resolve(self); 
    }); 
    }; 
    this.bar = function() { 
    var self = this; 
    return new Promise(function (resolve, reject) { 
     console.log('bar'); 
     resolve(self); 
    }); 
    } 
} 

new Foobar().foo().then(function(foobar) { return foobar.bar(); }); 
Смежные вопросы