【问题标题】:How do you "recieve" a promise from an interface or a promise's content?你如何“接收”来自接口或承诺内容的承诺?
【发布时间】:2023-03-10 21:49:01
【问题描述】:

我问这个问题是因为我不明白对我搜索的问题提供的解释,所以这个问题可能很常见。我使用另一个人的代码来尝试学习它是如何工作的,以便复制它。在一个可注入的方法中,原作者返回了一个 Promise,而我试图从一个注入 Promise 的方法中获取 Promise 的“内部”。

我将发布代码: 这是作者的代码

getLists(){ 
    return this.isReady()
    .then(()=>{
      return this.database.executeSql("SELECT * from list", [])
      .then((data)=>{
        let lists = [];
        for(let i=0; i<data.rows.length; i++){
          lists.push(data.rows.item(i));
          console.log(i);
        }
        return lists;
      })
    })}

这就是我或多或少在做的事情,但是因为类型不一样所以不起作用(string[] 与 Promise 不同)

`

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { DatabaseService } from '../../app/database-service';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html',
  providers:[DatabaseService],
})
export class HomePage {
  listas:string[];

  constructor(public navCtrl: NavController, private service:DatabaseService ) {


  }
  getLists(){
  this.listas=this.service.getLists();
  }
  getList(){
    this.service.getList(0);
  }
  addList(){
    this.service.addList("Shazam");
  }
  deleteList(){
    this.service.deleteList(0);
  }

}`

感谢您的耐心和理解。

【问题讨论】:

    标签: javascript angularjs sqlite typescript ionic-framework


    【解决方案1】:

    为了进一步理解,之所以有一个promise而不是一个列表,是因为Promise.then函数返回了一个promise。

    在 getLists() 函数的返回中,您返回 this.isReady().then(),这将向调用者返回一个 Promise。

    该代码的其余部分只是修改了该承诺中返回的内容,而不是该承诺本身。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

    此外,promise 会等待返回的 promise 解决,然后再继续下一个 then()... 例如:(也由于 lambda 语法,这只会在 chrome 中运行)

    getPromise().then(a => console.log('a', a));
    
    function getPromise() {
        return new Promise((res, rej) => {
            res(1);
        }).then(b => {
            console.log('b', b);
            return new Promise((res, rej) => {
                setTimeout(() => res(2), 3000);
            })
        }).then(c => {
            console.log('c', c);
            return new Promise((res, rej) => {
                setTimeout(() => res(3), 3000);
            })
        });
    }

    【讨论】:

      【解决方案2】:

      当数据准备好时设置listas

       getLists(){
         this.service.getLists().then(lists => this.listas = lists);
        }
      

      或者使用其他语法:

       async getLists(){
         this.listas = await this.service.getLists();
        }
      

      【讨论】:

      • 您的解决方案解决了问题,我现在明白它是如何工作的了。 .then 在准备好时调用一个函数并将列表作为参数传递给它,然后将该参数分配给范围的列表,对吗?那么你从哪里得到列表的价值呢?它是来自 getLists 的返回值(来自可注射的那个)吗?
      • @kazekum,是的,lists 是承诺所要解决的问题。
      猜你喜欢
      • 2017-01-22
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2015-04-15
      • 2023-01-27
      • 2013-11-25
      • 1970-01-01
      • 2018-02-15
      相关资源
      最近更新 更多