将承诺与订阅混合

时间:2020-02-20 16:56:06

标签: javascript

我有一个名为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); });

1 个答案:

答案 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); });