我有一个名为foo的订阅方法。我看到next的每个迭代的控制台输出。 我想从另一个文件调用此方法,并为next的每次迭代执行一个操作。如果我尝试使用.then(),它将捕获最后一个实例(如预期的那样)。
修改此代码以便能够在每次迭代中执行操作的最佳方法是什么?我通过修改代码以将回调传递给foo作为参数来使其工作。但是,这是最好的选择还是有更好的方法?
// MySubscriptions.js
import {execute} from 'apollo-link';
import {SubscriptionClient} from 'subscriptions-transport-ws';
import {WebSocketLink} from 'apollo-link-ws';
const link = new WebSocketLink(new SubscriptionClient('blah'));
async function foo(someQuery) {
return new Promise((resolve, reject) => {
execute(link, {query: someQuery })
.subscribe({
next: (result) => {
console.log('Resolving', result);
resolve(result);
},
error: (err) => reject(err);
complete: () => console.log('done');
});
});
}
export default {
runTestSubscription: () => foo('MyTestLink'),
};
// MyMainFile.js
import MySubscriptions from 'MySubscriptions.js'
MySubscriptions.runTestSubscription().then((result) => { console.log('Then', result); });
答案 0 :(得分:1)
不是将Observable
转换为Promise
,而是直接返回Observable
,然后在另一个文件中使用subscribe
代替then
。 / p>
// MySubscriptions.js
import {execute} from 'apollo-link';
import {SubscriptionClient} from 'subscriptions-transport-ws';
import {WebSocketLink} from 'apollo-link-ws';
const link = new WebSocketLink(new SubscriptionClient('blah'));
function foo(someQuery) {
const obs = execute(link, { query: someQuery });
obs.subscribe({
next: (result) => console.log('Resolving', result),
complete: () => console.log('done')
});
return obs;
}
export default {
runTestSubscription: () => foo('MyTestLink'),
};
// MyMainFile.js
import MySubscriptions from 'MySubscriptions.js'
MySubscriptions.runTestSubscription().subscribe((result) => { console.log('Then', result); });