복붙노트

[SCALA] JS는 이연 / 약속 / 미래 스칼라와 같은 함수형 언어에 비해

SCALA

JS는 이연 / 약속 / 미래 스칼라와 같은 함수형 언어에 비해

나는 주로 스칼라와 자바 스크립트와 같은 프로그래밍 언어를 사용하고 있습니다. 나는 반응 프로그래밍 비동기 두 언어를 사용하는 방법의 유사점과 차이점을 이해하려고 노력 중이 야. 당신이 나를 도와 드릴까요?

그것 (약속 / A 같은) 유사한 사양을 구현 많은 것 때문에 특정 JS 약속 프레임 워크를 가지고 있지 않다. 난 단지 지금까지 Q를 사용했습니다.

자바 스크립트에서 우리가 약속을 완료하는 이연 객체 우리의 결의를 호출 할 것으로 보인다. 스칼라에서는 약속 개체가 당신이 미래 모나드를 얻기 위해 해결 것 같다.

이 옳다면 누군가가 말해 줄래? JS와 스칼라 사이의 기간 약속의 다른 사용에 대한 어떤 좋은 이유가 있나요?

또한 스칼라에서 우리는 일반적으로 (또한 하스켈 bindin라고도 함)지도와 flatMap 같은 연산자를 사용하여 더 계산과 미래 모나드를 체인. JS에서 이들의 상응하는 무엇입니까?

제가 틀릴 수도 있지만 그것은 나에게 나타납니다 JS에서 다음 핸들을 모두지도와 flatMap 사업자 권리의 약속 종류에? 그렇다면, 그것은 JS에서 결과의 약속의 약속을 얻을 수있다? 우리는 미래를 얻을 수 있습니다처럼 [미래 [] 결과] 스칼라 (A 미래에 평평하게 할 수있다 어쨌든 [결과]).

JS 약속은 모나드인가? 종류의 메소드 이름이 정말 우리는 모나드 문학에서 찾을 일치하지 않습니다 그래서 경우에도 같다.

해결법

  1. ==============================

    1.매우 유사한 동안. 와 / A + 사양 그 때는 아니다 정말 모나드 바인드 약속을 준수하고 .MAP 및 .flatMap 모두 않는 자바 스크립트의 약속. 그 때는 핸들러 내부에서 당신은 재귀 적 랩을 해제 약속을 반환 할 때.

    매우 유사한 동안. 와 / A + 사양 그 때는 아니다 정말 모나드 바인드 약속을 준수하고 .MAP 및 .flatMap 모두 않는 자바 스크립트의 약속. 그 때는 핸들러 내부에서 당신은 재귀 적 랩을 해제 약속을 반환 할 때.

    Promise.delay(1000).then(function() {
        return Promise.delay(1000).then(function () {
            return Promise.delay(2000);
        }).then(function () {
            return Promise.delay(5000)
        });
    }).then(function () {
        alert("This is only shown after 8 seconds and not one");
    });
    

    (깡깡이)

    당신은 표준 JS 도서관을 약속하고 A + 사양은 모나드 약속을 특징으로하지 않습니다 정확합니다. 그들은 논의되었으며, 판타지 약속 등의 구현이 존재합니다. 그들은 전혀 다른 사양에 따라 거의 채택이있다. 또한이를 참조하십시오. 이 언어 디자인 포럼에 대한 지속적인 논의하고있다 - esdiscuss 및 flatmap 및 모나드 약속을 허용하지 않는 모나드 .chain 방법은 생각하지만, 그것을 만들 가능성이있다.

    이것은 실제적인 이유이다. 약속이 구현되는 현재의 방법은 대단히 유용합니다. 희귀는 실제로 미래 [미래를 원하고 일반적으로 당신이 언어로 바로 작업에 연속성을 원하는 경우입니다. 약속 모나드에서 '차용'과는 의미 자체가 '모나드'입니다. 그 때는 바인드에 매우 가까이와 내 머리에 나는 상호 교환 사용할 :)

    그것은 미래 같은 약속 [약속 [가치]가 불가능하다 [미래 [가치] 스칼라에서 가장 약속 라이브러리와. 당신은 객체에 싸서 약속 [컨테이너 [약속 [가치]]]을해야 할 것이다.

    Promise.delay(1000).then(function () {
        return Promise.delay(1000).then(function () {
            return {
                wrap: Promise.delay(2000).then(function () {
                    return Promise.delay(5000);
                })
            };
        });
    }).then(function () {
        alert("This logs after 1 second");
        // I've also not seen a really solid use case 
        // except TypeScript type inference which is meh
    });
    

    (깡깡이)

    이 둘 사이에 다른 작은 차이의 숫자도 있지만, 일반적으로 당신은 당신의 주장에 정확합니다.

  2. ==============================

    2.스칼라, 약속과 미래가 분리 된 기능을 가지고에서, 미래는 미래에 당신에게 약간 값을 돌려 비동기 계산 컨테이너이며, 약속은 다음과 같이 뭔가를 할 수 비동기 계산에 대한 쓰기 부분입니다

    스칼라, 약속과 미래가 분리 된 기능을 가지고에서, 미래는 미래에 당신에게 약간 값을 돌려 비동기 계산 컨테이너이며, 약속은 다음과 같이 뭔가를 할 수 비동기 계산에 대한 쓰기 부분입니다

    val promise = Promise[String]
    val future1 = promise.future
    val future2 = future1.map { case s => println(s); s }
    
    future2.onSuccess { case s => println(s + " 2nd time") }
    
    promise.success("promise completed")
    

    마지막 문을 실행하면 출력이됩니다

    promise completed
    promise completed 2nd time
    

    스칼라에서는 onComplete를을 사용하여 미래의 값을 읽거나, 당신이지도를 사용하여 체인, 당신은 그것의 약속 대응을 사용하여 미래에 쓰기

    JS 약속 A + 사양, 그들은 Promise.then이 부작용에 대한 체인 및 검색 값 모두에 사용됩니다 (예. CONSOLE.LOG), 아래 코드 스 니펫처럼 당신이 해결을 사용합니다 작성, 함께 번들로 제공됩니다

    var promise = new Promise(function(resolve, reject){
        Thread.sleep(10000);
        resolve("promise completed");
    }
    
  3. ==============================

    3.https://github.com/KjellSchubert/promise-future-task :이 문서는 여기에 대신 C ++ C # 및 파이썬과 자바 스크립트의 약속을 스칼라와 자바 스크립트의 약속을 비교,하지만하지 않습니다. 나는 당신이 물어 봤다 정확히 무엇 그게 전부 알고 있지만, 그럼에도 불구하고 당신에게 몇 가지 흥미로운 포인터를 줄 수 있습니다.

    https://github.com/KjellSchubert/promise-future-task :이 문서는 여기에 대신 C ++ C # 및 파이썬과 자바 스크립트의 약속을 스칼라와 자바 스크립트의 약속을 비교,하지만하지 않습니다. 나는 당신이 물어 봤다 정확히 무엇 그게 전부 알고 있지만, 그럼에도 불구하고 당신에게 몇 가지 흥미로운 포인터를 줄 수 있습니다.

  4. ==============================

    4.스칼라 달리 JS 약속, 모나드 아니다 때문에 암시 "thenable"에 모나드 법을 위반 풀기. 당신은, 그러나, 동일한 목적을 제공, 콜백 기반 모나드 의미와 기능을 구현할 수 있습니다.

    스칼라 달리 JS 약속, 모나드 아니다 때문에 암시 "thenable"에 모나드 법을 위반 풀기. 당신은, 그러나, 동일한 목적을 제공, 콜백 기반 모나드 의미와 기능을 구현할 수 있습니다.

    참조 예를 들어, cpsfy 라이브러리.

    .chain 하나만을 허용하면서 또한이 개 기능을 수용 그 때는 인해 구조적 차이가있다. 그러나, 2 인수 함수 심지어 숫자를 받아들이 체인 예처럼 구현 될 수있다 와 cpsfy에서 CPS 래퍼 :

    //function returning CPS function with 2 callbacks
    const readFileCps = file => (onRes, onErr) =>  
      require('fs').readFile(file, (err, content) => {
        err ? onErr(err) : onRes(content)
      })
    
    // CPS wraps a CPS function to provide the API methods
    const getLines = CPS(readFileCps('name.txt'))
      // map applies function to the file content
      .map(file => file.trim()) 
      .filter(file => file.length > 0)
      // chain applies function that returns CPS function
      .chain(file => readFileCps(file))
      .map(text => text.split('\n'))
    // => CPS function with 2 callbacks
    
    // To use, simply pass callbacks in the same order
    getLines(
      lines => console.log(lines),  // onRes callback
      err => console.error(err)  // onErr callback
    )
    
  5. from https://stackoverflow.com/questions/22724883/js-deferred-promise-future-compared-to-functional-languages-like-scala by cc-by-sa and MIT license